﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.Diagnostics;

namespace Entities
{
    public static class InitDB
    {
        public static void Seed()
        {
            using (Context db = new Context())
            {
                Console.WriteLine("Debut Initialisation DB......");

                #region Declarations
                Restaurant restaurant = new Restaurant();
                Zone zone = new Zone();
                Table table = new Table();

                Plat plat = new Plat();
                Plat boisson = new Plat();
                Specialite region = new Specialite();
                Formule menu = new Formule();
                Carte carte = new Carte();

                Notification notif = new Notification();
                Commande commande = new Commande();
                PreparationPlat platAfaire = new PreparationPlat();

                Utilisateur utilisateur = new Utilisateur();
                Serveur serveur = new Serveur();
                Manager manager = new Manager();
                Cuisinier cuisinier = new Cuisinier();
                #endregion

                #region Restaurant / Zone / Table

                //infos du restaurant
                restaurant.Nom = "Grenoble";
                restaurant.Adresse = "66 rue de nullpart 38000 Grenoble";
                restaurant.Capacite = 50;
                restaurant.Email = "grenoble@youfood.com";
                //
                restaurant.Utilisateur.Add(manager);
                restaurant.Zone.Add(zone);
                //
                db.Restaurants.AddObject(restaurant);

                //infos de zone
                zone.Numero = 1;
                //
                zone.Restaurant = restaurant;
                zone.Serveur = serveur;
                zone.Table.Add(table);
                //
                db.Zones.AddObject(zone);

                //infos de table
                table.Numero = 1;
                table.Capacite = 4;
                //
                table.Zone = zone;
                table.Commande = commande;
                //
                db.Tables.AddObject(table);

                #endregion

                #region Plat / Specialité / Carte
                plat.setType(TypePlat.PlatPrincipal);
                plat.Nom = "Pizza";
                plat.Prix = 7.50;
                //
                plat.Specialite = region;
                //
                db.Plats.AddObject(plat);


                region.Nom = "Italien";
                //
                region.Plat.Add(plat);
                //
                db.Specialites.AddObject(region);


                boisson.Nom = "Coca-Cola";
                boisson.setType(TypePlat.Boisson);
                boisson.Prix = 1.00;
                //
                db.Plats.AddObject(boisson);

                menu.Nom = "Formule Midi";
                menu.Prix = 8.00;
                //
                menu.Plat.Add(plat);
                menu.Plat.Add(boisson);
                //
                db.Formules.AddObject(menu);

                carte.Nom = "Settimana Italiana";
                //
                carte.Specialite = region;
                carte.Plat.Add(plat);
                carte.Formule.Add(menu);
                //
                db.Cartes.AddObject(carte);

                #endregion

                #region Notifications / Commandes / PlatAfaire
                notif.setType(TypeNotification.PlatPret);
                notif.Fait = true;
                //
                notif.Commande = commande;
                notif.Serveur = serveur;
                notif.PreparationPlat = platAfaire;
                //
                db.Notifications.AddObject(notif);

                commande.EstRegle = false;
                commande.setEtatCommande(TypePlat.PlatPrincipal);
                //
                commande.Table = table;
                commande.Formule.Add(menu);
                commande.Serveur = serveur;
                commande.PreparationPlat.Add(platAfaire);
                commande.Notification.Add(notif); 
                //
                db.Commandes.AddObject(commande);


                platAfaire.setType(EtatPlat.PlatPret);
                //
                platAfaire.Plat = plat;
                platAfaire.Commande = commande;
                platAfaire.Cuisinier = cuisinier;
                //
                db.PreparationPlats.AddObject(platAfaire);
                #endregion

                #region Utilisateurs et derivés
                utilisateur.Email = "table101@youfood.com";
                utilisateur.Password = "Supinf0";
                //
                utilisateur.Restaurant = restaurant;
                //
                db.Utilisateurs.AddObject(utilisateur);

                serveur.Email = "gblabla@youfood.com";
                serveur.Prenom = "Ginette";
                serveur.Nom = "Blabla";
                serveur.Password = "Supinf0";
                //
                serveur.Restaurant = restaurant;
                serveur.Zone = zone;
                //
                db.Utilisateurs.AddObject(serveur);

                manager.Email = "gburp@youfood.com";
                manager.Prenom = "Georges";
                manager.Nom = "Burp";
                manager.Password = "Supinf0";
                manager.Telephone = 068545625;
                //
                manager.Restaurant = restaurant;
                //
                db.Utilisateurs.AddObject(manager);

                cuisinier.Email = "bburger@youfood.com";
                cuisinier.Prenom = "Bob";
                cuisinier.Nom = "Burger";
                cuisinier.Password = "Supinf0";
                //
                cuisinier.PreparationPlat = platAfaire;
                //
                db.Utilisateurs.AddObject(cuisinier);

                #endregion

                Console.WriteLine("Validation OK");


                Console.WriteLine("Seeding the DB");
                try
                {
                    db.SaveChanges();

                    Console.WriteLine("Seeding OK");
                }
                catch (Exception ex)
                {
                    throw ex.InnerException;
                }
            }
        }
    }
}
